/*
  巧克力
  题目描述
    儿童节那天有 K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
    小明一共有 N 块巧克力，其中第 i 块是 Hi × Wi 的方格组成的长方形。
    为了公平起见，小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。
    切出的巧克力需要满足：
      1. 形状是正方形，边长是整数。
      2. 大小相同。
    例如, 一块 6 × 5 的巧克力可以切出 6 块 2 × 2 的巧克力或者 2 块 3 × 3 的巧克力。
    当然小朋友们都希望得到的巧克力尽可能大，你能帮小明计算出最大的边长是多少么？
  输入格式
    第一行包含两个整数 N 和 K。(1 ≤ N, K ≤ 10^5)。
    以下 N 行每行包含两个整数 Hi 和 Wi。(1 ≤ Hi, Wi ≤ 10^5)。
    输入保证每位小朋友至少能获得一块 1 × 1 的巧克力。
  输出格式
    输出切出的正方形巧克力最大可能的边长。
  输入数据 1
    2 10
    6 5
    5 6
  输出数据 1
    2
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值: 1;
          区间的最大值: "假设每块巧克力只获得一块最大的正方形巧克力，n 块巧克力中能获得最大的正方形巧克力的最大值";
      2) 判断某个答案是否满足题意的判定方法:
          遍历每块巧克力，计算每块巧克力能切出几块边长为 x(答案) 的正方形，并进行累加；
          如果累加值大于等于小朋友的个数 k，则该答案满足题目要求；
          否则，答案不能满足题目要求。
*/

int n, k;
int a[100005][2] = {}; // a[i][0] 表示发起第 i 块巧克力的长，a[i][1] 表示发起第 i 块巧克力的宽 (其中 i > 0)
int s = 1, e = 0;      // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                       // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即得到的正方形巧克力的边长) 是否满足条件(题目要求)
bool cmp(int x) {
    int sum = 0; // 得到的边长为 x 的正方形巧克力的个数

    // 如果得到的边长为 x 的正方形巧克力的个数大于等于小朋友的个数 k，则该答案满足题目要求；
    // 否则，答案不能满足题目要求。
    for(int i = 1; i <= n; i++) {
        sum += (a[i][0] / x) * (a[i][1] / x); // 计算每块巧克力能切出几块边长为 x(答案) 的正方形，并进行累加
    }

    return sum >= k;
}

int main() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i][0] >> a[i][1];
        int x = min(a[i][0], a[i][1]);
        e = max(e, x); // 区间的最大值: "假设每块巧克力只获得一块最大的正方形巧克力，n 块巧克力中能获得最大的正方形巧克力的最大值";
    }

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最小值
      注意:
        特别技巧: 我们在编码时，要保证区间的最大值 e 一定大于等于 区间的最小值 s
                 这样就可以保证一定会进行一次循环处理!
    */
    int ans = 0;
    while (s <= e) {
        int mid = (s + e) / 2;
        if (cmp(mid)) {
            ans = mid;
            s = mid + 1;  // 由于需要答案尽可能地大，所以我们进一步从 mid 的右半区间进行查找
        } else {
            e = mid - 1;  // mid 不满足题目要求，从 mid 的左半区间进行查找
        }
    }
    cout << ans;

    return 0;
}